﻿#ifndef __AF_WINDOW_H__
#define __AF_WINDOW_H__

namespace AF
{
	struct CreateWindow;
	class Window;
}
typedef AF::CreateWindow		AF_SCreateWindow;
typedef AF::Window			AF_CWindow;

#include "AF_Define.h"
#include "AF_Event.h"
#include "AF_Scene.h"
#include "AF_Canvas.h"

namespace AF
{
	/**
 	 *  @addtogroup Frame
	 *  @{
	 */

	/// 创建窗口信息结构
	struct CreateWindow
	{
		Window*			pWindow;	// 已经生成的窗口类

		UINT			nWidth;
		UINT			nHeight;
		bool			isFullScreen;

		Bundle			bdlOther;
	};


	/// 运行窗口类
	class Window
	{
	public:
		Window();
		~Window();

	public:
		/// 设置窗口标题
		virtual void		SetTitle(const _STRING strTitle);

	public:
		/// 初始化窗口
		bool			InitWindow(CreateWindow& cw);
		/// 显示窗口
		bool			ShowWindow();
		/// 隐藏窗口
		void			HideWindow();
		/// 运行窗口
		bool			RunWindow(Scene* pScene);
		/// 更新窗口
		void			UpdateWindow();
		/// 渲染窗口
		void			RenderWindow();
		/// 翻转窗口
		void			FlipWindow();
		/// 空闲窗口
		void			IdleWindow();
		/// 关闭窗口
//		void			CloseWindow();

	public:
		/// 更换主场景
		void			TurnScene(Scene* pScene);
		/// 调用场景
		int			CallScene(Scene* pScene);
	private:
		void			RunScene(Scene* pScene);

	public:
		/// 设置FPS每秒画面更新次数
		void			SetFPS(UINT nFPS);
		/// 获得FPS每秒画面更新次数
		UINT			GetFPS();

		/// 获得窗口句柄
		WindowHandle		GetHandle();

	protected:
		/// 当初始化窗口时
		virtual WindowHandle	OnInitWindow(CreateWindow& cw)
					{return NULL;}
		/// 当获得窗口事件时
		virtual void		OnGetEvent(Event& event)
					{return;}

	private:
		// 渲染场景
		void			RenderScene(Scene* pScene);
		// FPS控制
		void			FPSControl();

	private:
		/// 获得窗口事件
		virtual bool		GetEvent(Event& event);


	public:
		/// 窗口尺寸属性（只读）
		DIM_ATTRIB_R(Size, Size);
		/// 窗口全屏属性（只读）
		DIM_ATTRIB_R(bool, FullScreen);
		/// 窗口顶层场景属性（只读）
		DIM_ATTRIB_ASSOCIATED_R(Scene*, TopScene, m_pTopScene);

	protected:
		/// 窗口句柄
		WindowHandle		m_pWndHandle;
		/// 当前窗口主场景
		Scene*			m_pCurScene;
		/// 跳转目标主场景
		Scene*			m_pAimScene;
		/// 窗口顶层场景指针
		Scene*			m_pTopScene;

		/// 窗口更新时间属性
		UINT			m_nFPS;
		TimeTicks		m_ttFPST;

	private:
		bool			m_isExitWnd;
		bool			m_isShowWnd;

#ifdef AF_FPS_CONTROL
	private:
		TimeTicks		m_ttSaveFPST;
		TimeTicks		m_ttFPSTUse;
#endif

	};

	/** @} */

}

#endif